package api

import (
	"github.com/gin-contrib/cors"
	"github.com/gin-gonic/gin"
	"github.com/slrun/callcenter/internal/app/handler"
	"github.com/slrun/callcenter/internal/middleware"
)

// RegisterRoutes 注册所有API路由
func RegisterRoutes(router *gin.Engine, handler *handler.Handler) {
	// 配置CORS
	router.Use(cors.New(cors.Config{
		AllowOrigins:     []string{"*"},
		AllowMethods:     []string{"GET", "POST", "PUT", "DELETE", "OPTIONS"},
		AllowHeaders:     []string{"Origin", "Content-Type", "Authorization"},
		ExposeHeaders:    []string{"Content-Length"},
		AllowCredentials: true,
	}))

	// 健康检查
	router.GET("/health", handler.HealthCheck)

	// API路由组
	api := router.Group("/api/v1")
	{
		// 认证路由（使用SystemHandler中的方法）
		auth := api.Group("/auth")
		{
			// 登录路由不需要认证
			auth.POST("/login", handler.SystemHandler.Login)
			// 登出和刷新token需要认证
			authProtected := auth.Group("/")
			if handler.Services != nil && handler.Services.SystemService != nil {
				authProtected.Use(middleware.AuthMiddleware(handler.Services.SystemService))
			}
			{
				authProtected.POST("/logout", handler.SystemHandler.Logout)
			}
		}

		// 需要认证的路由
		authenticated := api.Group("/")
		if handler.Services != nil && handler.Services.SystemService != nil {
			authenticated.Use(middleware.AuthMiddleware(handler.Services.SystemService))
		}
		{
			// 用户管理（使用SystemHandler中的方法）
			user := authenticated.Group("/users")
			{
				user.GET("/", handler.SystemHandler.ListUsers)        // 获取用户列表
				user.GET("/:id", handler.SystemHandler.GetUser)        // 获取用户详情
				user.POST("/", handler.SystemHandler.CreateUser)     // 创建用户
				user.PUT("/:id", handler.SystemHandler.UpdateUser)    // 更新用户
				user.DELETE("/:id", handler.SystemHandler.DeleteUser) // 删除用户
				user.PUT("/:id/password", handler.SystemHandler.ChangePassword) // 修改密码
			}

			// 角色管理（使用SystemHandler中的方法）
			role := authenticated.Group("/roles")
			{
				role.GET("/", handler.SystemHandler.ListRoles)        // 获取角色列表
				role.GET("/:id", handler.SystemHandler.GetRole)        // 获取角色详情
				role.POST("/", handler.SystemHandler.CreateRole)     // 创建角色
				role.PUT("/:id", handler.SystemHandler.UpdateRole)    // 更新角色
				role.DELETE("/:id", handler.SystemHandler.DeleteRole) // 删除角色
			}

			// 系统配置管理（使用SystemHandler中的方法）
			config := authenticated.Group("/configs")
			{
				config.GET("/", handler.SystemHandler.GetSystemConfigs) // 获取系统配置列表
				config.GET("/:key", handler.SystemHandler.GetSystemConfig) // 获取单个系统配置
				config.PUT("/:key", handler.SystemHandler.UpdateSystemConfig) // 更新系统配置
				config.PUT("/batch", handler.SystemHandler.BatchUpdateSystemConfigs) // 批量更新系统配置
			}

			// 权限验证（使用SystemHandler中的方法）
			permissions := authenticated.Group("/permissions")
			{
				permissions.GET("/check/:permission", handler.SystemHandler.CheckPermission) // 检查权限
				permissions.GET("/", handler.SystemHandler.GetUserPermissions) // 获取用户权限
			}

			// 用户信息（使用SystemHandler中的方法）
			authenticated.GET("/user/info", handler.SystemHandler.GetUserInfo) // 获取当前用户信息

			// 审计日志（使用SystemHandler中的方法）
			authenticated.GET("/audit-logs", handler.SystemHandler.GetAuditLogs) // 获取审计日志

			// 工单管理路由组（使用TicketHandler中实际存在的方法）
			if handler.TicketHandler != nil {
				ticket := authenticated.Group("/tickets")
				{
					ticket.GET("/:id", handler.TicketHandler.GetTicket)                   // 获取工单详情
					ticket.POST("/", handler.TicketHandler.CreateTicket)                  // 创建工单
					ticket.PUT("/:id", handler.TicketHandler.UpdateTicket)                // 更新工单
					ticket.POST("/:id/assign", handler.TicketHandler.AssignTicket)        // 分配工单
				}
			}

			// 监控和报表（使用MonitorHandler中实际存在的方法）
			if handler.MonitorHandler != nil {
				monitor := authenticated.Group("/monitor")
				{
					monitor.GET("/realtime", handler.MonitorHandler.GetRealTimeMonitor) // 获取实时监控数据
					monitor.GET("/reports/calls", handler.MonitorHandler.GetCallReport) // 获取呼叫报表
					monitor.GET("/reports/agents", handler.MonitorHandler.GetAgentReport) // 获取座席报表
				}
			}

			// 系统管理（使用SystemHandler中的方法）
			system := authenticated.Group("/system")
			{
				// 系统配置管理
				system.GET("/config", handler.SystemHandler.GetSystemConfigs)           // 获取系统配置
				system.PUT("/config", handler.SystemHandler.BatchUpdateSystemConfigs)   // 更新系统配置
				
				// 用户管理
				system.GET("/users", handler.SystemHandler.ListUsers)                    // 获取用户列表
				system.POST("/users", handler.SystemHandler.CreateUser)                 // 创建用户
				system.GET("/users/:id", handler.SystemHandler.GetUser)                 // 获取用户详情
				system.PUT("/users/:id", handler.SystemHandler.UpdateUser)               // 更新用户
				system.DELETE("/users/:id", handler.SystemHandler.DeleteUser)            // 删除用户
				system.PUT("/users/:id/password", handler.SystemHandler.ChangePassword)  // 修改密码
				
				// 角色管理
				system.GET("/roles", handler.SystemHandler.ListRoles)                    // 获取角色列表
				system.POST("/roles", handler.SystemHandler.CreateRole)                 // 创建角色
				system.GET("/roles/:id", handler.SystemHandler.GetRole)                 // 获取角色详情
				system.PUT("/roles/:id", handler.SystemHandler.UpdateRole)               // 更新角色
				system.DELETE("/roles/:id", handler.SystemHandler.DeleteRole)            // 删除角色
				
				// 个人资料和密码
				system.GET("/profile", handler.SystemHandler.GetUserInfo)               // 获取个人资料
				system.PUT("/profile", func(c *gin.Context) {
					// 获取当前用户ID并调用UpdateUser
					userID, exists := c.Get("user_id")
					if !exists {
						c.JSON(401, gin.H{"error": "未认证的请求"})
						return
					}
					c.Params = append(c.Params, gin.Param{Key: "id", Value: userID.(string)})
					handler.SystemHandler.UpdateUser(c)
				}) // 更新个人资料
				system.POST("/change-password", func(c *gin.Context) {
					// 获取当前用户ID并调用ChangePassword
					userID, exists := c.Get("user_id")
					if !exists {
						c.JSON(401, gin.H{"error": "未认证的请求"})
						return
					}
					c.Params = append(c.Params, gin.Param{Key: "id", Value: userID.(string)})
					handler.SystemHandler.ChangePassword(c)
				}) // 修改密码
				
				// 审计日志
				system.GET("/audit/logs", handler.SystemHandler.GetAuditLogs)          // 获取审计日志
			}
		}
	}
}